<?php

namespace App\Http\Controllers\Car;

use App\Models\CarModels\CarAccidentRecord;
use App\Models\CarModels\CarFuelRecord;
use App\Models\CarModels\CarInsuranceRecord;
use App\Models\CarModels\CarInsuranceRecordsKind;
use App\Models\CarModels\CarMaintence;
use GatewayWorker\Lib\Db;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Database\QueryException;
use Validator;
/**
 * @group 设备管理->任务管理->保险记录
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class CarInsuranceRecordController extends Controller
{
    /**
     * @queryParam order 保险单号
     * @queryParam target 保险金额
     * @queryParam kind 险种
     * @queryParam rate 赔付率
     * @queryParam amount 保险金额
     * @queryParam company  投保公司
     * @queryParam buy_date 购买日期
     * @queryParam end_date 保险责任日期
     * @queryParam start_date 投保日期
     * @queryParam car_id 车辆信息
     * @queryParam record_id 年检信息
     *
     * @bodyParam search string optional 地址信息（模糊）暂定 原型图不清楚
     * @bodyParam user int optional 筛选负责人信息 暂定 原型图不清楚
     * @bodyParam car_id int optional 筛选车辆的所有保险
     *
     * @bodyParam search int optional 筛选负责人信息 暂定 原型图不清楚
     * @bodyParam kind int optional 筛选车辆的所有保险
     */
    public function index(Request $request){
        $query = CarInsuranceRecord::with('car')->with('record')->with('bill')->with('kind');
        $query->whereHas('car',function ($q) use($request){
            $request->has('search') && $q->where('plates_number','like',"%{$request->get('search')}%");
            $request->has('kind') && $q->where('kinds_id', $request->get('kind'));
        });
        return response()->json(encodeMsg(pageQuery($query,$request),200),200);
    }

    /**
     *
     * @bodyParam company string optional 投保公司
     * @bodyParam buy_date datetime optional 购买日期
     * @bodyParam end_date datetime optional 保险责任日期
     * @bodyParam start_date datetime optional 保险日期
     * @bodyParam car_id int optional 车辆信息 外键 车辆信息
     * @bodyParam order string optional 保险单号 外键 年检信息
     * @bodyParam target string optional 保险金额
     * @bodyParam kind string optional 险种 外键 年检信息
     * @bodyParam rate float optional 赔付率 外键 年检信息
     * @bodyParam amount float optional 保险金额 外键 年检信息
     *
     * @queryParam order 保险单号
     * @queryParam target 标的
     * @queryParam kind 险种
     * @queryParam rate 赔付率
     * @queryParam amount 保险金额
     * @queryParam company  投保公司
     * @queryParam buy_date 购买日期
     * @queryParam end_date 保险责任日期
     * @queryParam start_date 投保日期
     * @queryParam car_id 车辆信息
     * @queryParam record_id 年检信息
     *
     */
    public function store(Request $request){
        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }

        try{
            \Illuminate\Support\Facades\DB::beginTransaction();
            $row=CarInsuranceRecord::create($request->all());
            if ($request->has('insurancelist')){
                $data=json_decode($request->get('insurancelist'),true);
                if (!$data)
                    return response()->json(encodeMsg(["message"=>"insurancelist数据格式出错"],400),400);
                foreach ($data as $k=>$v){
                    $v=array_merge_recursive($v,['record_id'=>$row->id]);
                    try{
                        CarInsuranceRecordsKind::create($v);
                    }catch (QueryException $e){
                        \Illuminate\Support\Facades\DB::rollBack();
                        return response()->json(encodeMsg($e->getMessage(),500),500);
                    }

                }
            }
            \Illuminate\Support\Facades\DB::commit();
            return response()->json(encodeMsg($row,201),201);
        }catch (QueryException $e){
            return response()->json(encodeMsg(["message"=>"数据添加出错"],400),400);
        }
    }

    /**
     *
     *
     * @queryParam order 保险单号
     * @queryParam target 保险金额
     * @queryParam kind 险种
     * @queryParam rate 赔付率
     * @queryParam amount 保险金额
     * @queryParam company  投保公司
     * @queryParam buy_date 购买日期
     * @queryParam end_date 保险责任日期
     * @queryParam start_date 投保日期
     * @queryParam car_id 车辆信息
     * @queryParam record_id 年检信息
     * @queryParam bill 发票信息 发票信息中嵌套有发票图片信息
     *
     */
    public function show($pk){
        $data = CarInsuranceRecord::with(['car','bill','record','kind'])->find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该记录"],404),404);
        }else{
            return response()->json(encodeMsg($data,200),200);
        }
    }
    /**
     * @bodyParam company string optional 投保公司
     * @bodyParam buy_date datetime optional 购买日期
     * @bodyParam end_date datetime optional 保险责任日期
     * @bodyParam start_date datetime optional 保险日期
     * @bodyParam car_id int optional 车辆信息 外键 车辆信息
     * @bodyParam record_id int optional 年检信息 外键 年检信息
     * @bodyParam order string optional 保险单号 外键
     * @bodyParam target string optional 保险金额
     * @bodyParam kind string optional 险种 外键
     * @bodyParam rate float optional 赔付率 外键
     * @bodyParam amount float optional 保险金额 外键
     *
     * @queryParam order 保险单号
     * @queryParam target 标的
     * @queryParam kind 险种
     * @queryParam rate 赔付率
     * @queryParam amount 保险金额
     * @queryParam company  投保公司
     * @queryParam buy_date 购买日期
     * @queryParam end_date 保险责任日期
     * @queryParam start_date 投保日期
     * @queryParam car_id 车辆信息
     * @queryParam record_id 年检信息
     *
     */
    public function update(Request $request, $pk){
        $e = genValidate();
        $validator = Validator::make($request->all(),$e);
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }

        try {
            \Illuminate\Support\Facades\DB::beginTransaction();
            $da=$request->all();
            if ($request->has('insurancelist')){
                unset($da['insurancelist']);
                $data=json_decode($request->get('insurancelist'),true);
                if (!$data)
                    return response()->json(encodeMsg(["message"=>"insurancelist数据格式出错"],400),400);
                CarInsuranceRecordsKind::where('record_id',$pk)->delete();
                foreach ($data as $k=>$v){
                    $v=array_merge_recursive($v,['record_id'=>$pk]);
                    $data=CarInsuranceRecordsKind::create($v);
                    if (!$data){
                        \Illuminate\Support\Facades\DB::rollBack();
                        return response()->json(encodeMsg(["message"=>"数据修改出错"],400),400);
                    }

                }
            }else{
                $carkind = CarInsuranceRecord::find($pk);
                if($carkind == []){
                    return response()->json(["message"=>"没有该保险记录"],404);
                }
                CarInsuranceRecord::where('id',$pk)->update($da);
            }

                \Illuminate\Support\Facades\DB::commit();
            return response()->json(encodeMsg($carkind,200), 200);
        }catch (QueryException $e){
            return response()->json(encodeMsg($e->getMessage(),400),400);
        }
    }

    /**
     */

    public function destroy($pk){
        $data = CarInsuranceRecord::find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该事故记录"],404),404);
        }
        $data->delete();
        return response()->json(encodeMsg(["message"=>"删除成功"],204),200);
    }
}
